#include<iostream>
#include<queue>
#include<string>
#include<map>
#define ll long long
using namespace std;
map<string,ll>m[2];
struct node{
    int x;
    int y;
    string zt;
    int dq;
    node(){
        dq=0;
    }
};
queue<pair<node,bool> >q;
queue<pair<node,bool> >q1;
int map1[20][20];
int flag;
int fx[8]={1,1,-1,-1,2,2,-2,-2};
int fy[8]={2,-2,2,-2,1,-1,1,-1};
string mb="111110111100*110000100000";
int main(){
    int n;
    int sx;
    int sy;
    cin>>n;

    ll qd=0;
    for(int k=1;k<=n;k++){
        flag=0;
        string s;
        string line;
        m[0].clear();
        m[1].clear();
        char x;
        cin.ignore();
        for(int i=1;i<=5;i++){
            getline(std::cin,line);
            s+=line;
        }
        for(int i=1;i<=5;i++){
            for(int j=1;j<=5;j++){
                  while (std::cin.get(x)) {
        if (x == '*' || std::isdigit(x)) {
            break;  // 如果输入的是 '*' 或数字，结束循环
        }
    }
    if (x == '*') {
        s += '*';  // 如果是 '*'，添加到结果中
    } else {
        s += x;    // 如果是数字，添加该数字
    }
            }
        }
    for(int i=0;i<s.length();i++){
        if(s[i]=='*'){
            sy=i%5+1;
            sx=i/5+1;
            break;
        }
    }
    node qd1;
    qd1.x=sx;
    qd1.y=sy;
    qd1.zt=s;
    node zd;
    zd.x=3;
    zd.y=3;
    zd.zt=mb;
    q.push(pair<node,bool>(qd1,1));
    q1.push(pair<node,bool>(zd,0));
    m[1][qd1.zt]=0; // 起始状态
    m[0][zd.zt]=0;  // 目标状态
     while(!q.empty()){
       pair<node,bool>f=q.front();
       q.pop();
        if(f.first.dq==9)break;
        if(m[f.second^1].count(f.first.zt)==true){
        if(f.first.dq+m[f.second^1][f.first.zt]<=15){
        cout<<f.first.dq+m[f.second^1][f.first.zt]<<endl;
        flag=1;
        break;
        }
       }
       for(int i=0;i<8;i++){
        int nx=f.first.x+fx[i];
        int ny=f.first.y+fy[i];
        if(nx>5||ny>5||nx<1||ny<1)continue;
        string ns=f.first.zt;
       swap(ns[(nx-1)*5 + (ny-1)], ns[(f.first.x-1)*5 + (f.first.y-1)]);
        if(m[f.second].count(ns)==false){
            node nn;
            nn.dq=f.first.dq+1;
            nn.x=nx;
            nn.y=ny;
            nn.zt=ns;
            q.push(pair<node,bool>(nn,f.second));
            m[f.second][ns]=f.first.dq+1;
        }
       }
     }
     if(flag==0)
     {
        while(!q1.empty()){
       pair<node,bool>f=q1.front();
       q1.pop();
        if(f.first.dq==9)break;
        if(m[f.second^1].count(f.first.zt)==true){
        if(f.first.dq+m[f.second^1][f.first.zt]<=15){
        cout<<f.first.dq+m[f.second^1][f.first.zt]<<endl;
        flag=1;
        break;
        }
        else break;
       }
       for(int i=0;i<8;i++){
        int nx=f.first.x+fx[i];
        int ny=f.first.y+fy[i];
        if(nx>5||ny>5||nx<1||ny<1)continue;
        string ns=f.first.zt;
       swap(ns[(nx-1)*5 + (ny-1)], ns[(f.first.x-1)*5 + (f.first.y-1)]);
        if(m[f.second].count(ns)==false){
            node nn;
            nn.dq=f.first.dq+1;
            nn.x=nx;
            nn.y=ny;
            nn.zt=ns;
            q1.push(pair<node,bool>(nn,f.second));
            m[f.second][ns]=f.first.dq+1;
        }
       }
     }
     }
     if(!flag)cout<<-1<<endl;
     while(!q.empty())q.pop();
     while(!q1.empty())q1.pop();
    }
    return 0;
}